package com.agm.android.task;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;

import com.agm.android.constants.Constants;
import com.agm.dto.Giocatore;
import com.agm.dto.LegaSquadra;
import com.agm.dto.Partita;
import com.agm.dto.Squadra;
import com.example.android.navigationdrawerexample.App;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * Classe AsyncTask che si occupa di lanciare il task di sincronizzazione dei dati dell'applicazione.
 * @author AGM
 *
 */
public class SyncTask extends AsyncTask<Void, Void, Boolean> {
	private static final String IDLEGAPRIVATA = "idlegaprivata";
	private static final String IDLEGA = "idlega";
	private static final String IDLEGAPUBBLICA = "idlegapubblica";
	private static final String PASSWORD = "password";
	private static final String USERNAME = "username";

	@Override
	protected Boolean doInBackground(Void... params) {
		ObjectMapper mapper = new ObjectMapper();
		try {
			setLega(mapper);
			setRosa(mapper);
			setCalendario(mapper);
			setClassifica(mapper);
		} catch (JSONException e) {
			e.printStackTrace();
			return false;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return false;
		} catch (ClientProtocolException e) {
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}

		return true;
	}

	/**
	 * Metodo per il recupero dei dati inerenti la Rosa.
	 * Si occupa di chiamare il servizio REST "getRosa" e di popolare l'oggetto App.rosa
	 * @param mapper
	 * @throws JSONException
	 * @throws UnsupportedEncodingException
	 * @throws IOException
	 * @throws ClientProtocolException
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 */
	public static void setRosa(ObjectMapper mapper) throws JSONException,
			UnsupportedEncodingException, IOException,
			ClientProtocolException, JsonParseException,
			JsonMappingException {

		JSONObject holder = new JSONObject();
		DefaultHttpClient httpclient = new DefaultHttpClient();
		HttpPost httpost = new HttpPost(Constants.URL_REST + "getRosa");

		setCredential4Post(holder);
		setIdLega(holder);
		holder.put(new String(IDLEGAPUBBLICA),
				App.utente.getIdlegapubblica());
		InputStream is = ottineniInputStream(holder, httpclient, httpost);

		App.rosa = mapper.readValue(is, Giocatore[].class);
	}

	/**
	 * Metodo per il recupero dei dati inerenti il Calendario.
	 * Si occupa di chiamare il servizio REST "getGiornataLega" e di popolare l'oggetto App.partite
	 * @param mapper
	 * @throws JSONException
	 * @throws UnsupportedEncodingException
	 * @throws IOException
	 * @throws ClientProtocolException
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 */
	public static void setCalendario(ObjectMapper mapper) throws JSONException,
			UnsupportedEncodingException, IOException,
			ClientProtocolException, JsonParseException,
			JsonMappingException {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		HttpPost httpost = new HttpPost(Constants.URL_REST_OLD
				+ "getGiornataLega");
		JSONObject holder = new JSONObject();
		setCredential4Post(holder);
		setIdLega(holder);
		
		InputStream is = ottineniInputStream(holder, httpclient, httpost);
		
		App.partite = mapper.readValue(is, Partita[].class);
	}

	/**
	 * Metodo per il recupero dei dati inerenti la Classifica
	 * Si occupa di chiamare il servizio REST "getClassificaLega" e di popolare l'oggetto App.squadre
	 * @param mapper
	 * @throws JSONException
	 * @throws UnsupportedEncodingException
	 * @throws IOException
	 * @throws ClientProtocolException
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 */
	public static void setClassifica(ObjectMapper mapper) throws JSONException,
			UnsupportedEncodingException, IOException,
			ClientProtocolException, JsonParseException,
			JsonMappingException {
		JSONObject holder = new JSONObject();
		DefaultHttpClient httpclient = new DefaultHttpClient();
		HttpPost httpost = new HttpPost(Constants.URL_REST + "getClassificaLega");
		setCredential4Post(holder);
		setIdLega(holder);
		
		InputStream is = ottineniInputStream(holder, httpclient, httpost);
		
		App.squadre = mapper.readValue(is, Squadra[].class);
	}

	/**
	 * Metodo per il recupero dei dati inerenti la Lega
	 * Si occupa di chiamare il servizio REST "getLega" e di popolare l'oggetto App.leghe
	 * @param mapper
	 * @throws JSONException
	 * @throws UnsupportedEncodingException
	 * @throws IOException
	 * @throws ClientProtocolException
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 */
	public static void setLega(ObjectMapper mapper) throws JSONException,UnsupportedEncodingException, IOException,
			ClientProtocolException, JsonParseException,JsonMappingException {
		
		JSONObject holder = new JSONObject();
		DefaultHttpClient httpclient = new DefaultHttpClient();
		HttpPost httpost = new HttpPost(Constants.URL_REST + "getLega");

		setCredential4Post(holder);
		holder.put(new String(IDLEGAPRIVATA),App.utente.getIdlegaprivata());
		holder.put(new String(IDLEGAPUBBLICA),App.utente.getIdlegapubblica());
		
		InputStream is = ottineniInputStream(holder, httpclient, httpost);
		
		LegaSquadra[] listaLeghe = mapper.readValue(is, LegaSquadra[].class);
		
		App.leghe = listaLeghe;//listaLeghe[0];
	}

	/**
	 * @param holder
	 * @throws JSONException
	 */
	private static void setCredential4Post(JSONObject holder)
			throws JSONException {
		holder.put(new String(USERNAME), App.utente.getUserid());
		holder.put(new String(PASSWORD), App.utente.getPassword());
	}

	/**
	 * @param holder
	 * @param httpclient
	 * @param httpost
	 * @return
	 * @throws UnsupportedEncodingException
	 * @throws IOException
	 * @throws ClientProtocolException
	 */
	private static InputStream ottineniInputStream(JSONObject holder,
			DefaultHttpClient httpclient, HttpPost httpost)
			throws UnsupportedEncodingException, IOException,
			ClientProtocolException {
		StringEntity se = new StringEntity(holder.toString());

		httpost.setEntity(se);

		httpost.setHeader("Accept", "application/json");
		httpost.setHeader("Content-type", "application/json");
		HttpResponse response = httpclient.execute(httpost);
		HttpEntity httpEntity = response.getEntity();
		InputStream is = httpEntity.getContent();
		return is;
	}
	

	/**
	 * @param holder
	 * @throws JSONException
	 */
	private static void setIdLega(JSONObject holder) throws JSONException {
		long idLega = 0;
		if(App.lega != null){
			idLega = App.lega.getIdlega();
		}
		holder.put(new String(IDLEGA),idLega);
	}

	@Override
	protected void onPostExecute(final Boolean success) {
		
	}

	@Override
	protected void onCancelled() {
		
	}
}
